/**
  ******************************************************************************
  * @file    prototypes.h
  * @author  Dragon.Chen
  * @version V1.0.0
  * @date    09-15-2014
  * @brief   用户自定义
  ******************************************************************************
  *
  * <h2><center>&copy; COPYRIGHT 2016 上海今中网络科技有限公司 </center></h2>
  ******************************************************************************
  */

#ifndef __PROTOTYPES__H__
#define __PROTOTYPES__H__

#include <unistd.h>
#include <openssl/ssl.h>

/********************* master-worker进程相关定义 *********************/
/// 进程相关宏
#define WORKER_MAX_NPROCESS             128     // worker进程总数
#define WORKER_MAX_NCLIENT              (ServerConfig.nConnection / ServerConfig.nWorkerProcess)
                                                // worker的最大用户数量
#define WORKER_MAX_EVENT_NUMBER         (WORKER_MAX_NCLIENT < 100000 ? WORKER_MAX_NCLIENT / 10 : 10000)
                                                // worker epoll能处理的最大事件数
#define MASTER_MAX_EVENT_NUMBER         128     // master epoll能处理的最大事件数
#define WORKER_EPOLL_WAIT_TIME          5000    // worker等待时间
#define MASTER_EPOLL_WAIT_TIME          5000    // master等待时间
#define WORKER_LOGIN_TIMEOUT            ServerConfig.loginTimeout
                                                // 登陆超时
#define WORKER_HEARTBEAT_TIMEOUT        ServerConfig.heartbeatTimeout
                                                // 心跳包超时
#define MASTER_RECREATE_WORKER_MAXTIME  ServerConfig.recreateWorkerMaxTime
                                                // 再次启动worker时间间隔(单位:秒)
#define MASTER_RECYCLE_WORKERS_MAXTIME  ServerConfig.recycleWorkersMaxTime
                                                // master等待所有子进程退出的最大时间(单位:秒)
#define MASTER_EXIT_NORMAL              -1      // master正常退出
#define MASTER_EXIT_ABNORMAL            -2      // master非正常退出
#define MASTER_EXIT_FATAL               -3      // master无法回收worker进程，直接退出程序


/// 进程信息
typedef struct _worker_process_t
{
    pid_t               pid;                    // worker进程PID
    int                 busyRatio;              // 繁忙率(用于负载均衡)
    int                 pipefd[2];              // master-worker通讯管道
} WORKER_PROCESS_T;

/// 命令行选项
typedef enum _option_t
{
    OPT_START = 1,
    OPT_STOP,
    OPT_CONFIG_PATH,
    OPT_RECONFIG,
    OPT_REMOVE,
    OPT_RELOAD_CA,
    OPT_RELOAD_CRL,
    OPT_VERSION,
    OPT_HELP
} OPTION_T;

/// 命令行选项
typedef struct _command_param_t
{
    u_int               start:1;
    u_int               stop:1;
    u_int               remove:1;
    u_int               reconfig:1;
    u_int               reloadCA:1;
    u_int               reloadCRL:1;
    u_int               version:1;
    u_int               help:1;
    char               *remmsg;
} COMMAND_PARAM_T;

/// 用户信号数据
typedef struct signal_user_t
{
    u_int               remove:1;
    u_int               reconfig:1;
    u_int               reloadCA:1;
    u_int               reloadCRL:1;
} SIGNAL_USER_T;

#define MASTER_SOCK_BUFLEN          128
#define WORKER_SOCK_BUFLEN          128

#define MW_SOCK_ACCEPT              (u_char)1
#define MW_BUSY_RATIO               (u_char)2
#define MW_READ_SHM_LOGOFF          (u_char)3
#define MW_RECONFIG                 (u_char)4
#define MW_RELOAD_CA                (u_char)5
#define MW_RELOAD_CRL               (u_char)6

#define EVENT_OF_CLIENT             1
#define EVENT_OF_LOGOFF             2
#define EVENT_OF_TIMER              4

#define SPLIT                       ";"


/********************** 服务器相关定义 **********************/
/// 服务器应用配置文件
typedef struct _server_config_t
{
    char                daemon;                 // 程序是否后台化
    char                pmos;                   // 警察系统认证
    char                nWorkerProcess;         // 工作进程个数
    int                 serverPort;             // 服务器端口号
    char               *serverIP;               // 服务器地址
    int                 loginTimeout;           // 登陆超时
    int                 heartbeatTimeout;       // 心跳超时
    int                 recycleWorkersMaxTime;  // 回收所有worker最大时间
    int                 recreateWorkerMaxTime;  // 再次创建Worker的最大时间间隔
    char               *logPath;                // log文件路径
    char               *rulePath;               // rule文件路径
    char               *stunnelPath;            // stunnel文件路径
    char               *utunnelPath;            // utunnel文件路径
    char               *openvpnPath;            // openvpn文件路径
    char               *windowVersion;          // window客户端最新版本
    char               *windowFVersion;         // window客户端强制更新最低版本
    char               *androidVersion;         // android客户端最新版本
    char               *androidFVersion;        // android客户端强制更新最低版本
    char               *pidPath;                // 进程号路径
    char              **caCertificatePath;      // CA证书路径
    char                nCaCertificate;         // CA证书个数
    char               *serverCertificatePath;  // 服务器证书路径
    char               *serverKeyPath;          // 服务器私鈅路径
    char               *certificateRevokeListPath;// 证书吊销列表
    char               *databasePath;           // 数据库路径
    char               *logDatabasePath;        //日志数据库路径
    int                 maxNumDBLog;            //日志数据库的最大记录数
    int                 delNumMaxDBLog;         //日志数据库达到最大记录时删除的条目数
    int                 databaseTimeout;        // 数据库链接超时
    int                 nConnection;            // 链接客户端数量
    u_int               nCPU:10;                // CPU个数
    u_int               appType:4;              // 应用类型
    u_int               verify:1;               // 是否认证
    ///****************patched by xiaohu add*************2016/03/17*******
    u_int               whiteList:1;             // 是否启动白名单
    u_int               blackList:1;             // 是否启动黑名单
} SERVER_CONFIG_T;

/************************ SOCKET数据包信息 *****************/
#define CLIENT_DATA_PACK_HEADLEN       4
#define CLIENT_DATA_PACK_MAXBUF        1020     // 数据包缓存区大小
#define CLIENT_SOCK_RECV_MAXBUF        1024     // SOCkET接收的最大数据
#define HEARTBEAT_DEATH                0        // 心跳活着
#define HEARTBEAT_ALIVE                1        // 心跳死去

/// 数据包头部
typedef enum _pack_head_t
{
    IDX_VPN_WELCOME = 1,
    IDX_VPN_VERSION,
    IDX_VPN_X509,
    IDX_VPN_SN,
    IDX_VPN_BIND,
    IDX_VPN_APPTYPE,
    IDX_VPN_OPENVPN,
    IDX_VPN_STUNNEL,
    IDX_VPN_UTUNNEL,
    IDX_VPN_BOTH,
    IDX_VPN_NONE,
    IDX_VPN_HEARTBEAT_TIMEOUT,
    IDX_VPN_HEARTBEAT,
    ///****************patched by xiaohu add*************2016/03/17*******
    IDX_VPN_PROCESS,                //按进程判断是否启动
    IDX_VPN_ANDROID_TYPE,           //按手机型号判断是否启动
    IDX_VPN_CHECK_RUNNING,          //检查正在运行的东西是否符合规则
    IDX_VPN_CHECK_RUNNING_SWITCH,   //
    IDX_VPN_AD_CHECK_SWITCH,        //
    IDX_VPN_AD_CHECK_RUNNING_SWITCH,//
	IDX_VPN_ZDJG_LOG,               //发送日志
	IDX_VPN_ANDROID_DOOR,           //android后门
	///********************************************************************
} PACK_HEAD_T;

/// 数据包
typedef struct _client_data_pack_t
{
	PACK_HEAD_T         head;                           // 数据头部
	unsigned char       buffer[CLIENT_DATA_PACK_MAXBUF];// 数据缓存区(发送端数据长度不大于1016)
} DATA_PACK_T;

/********************** 客户端相关定义 **********************/
/// 定义数据类型
typedef struct  _client_data_t     CLIENT_DATA_T;
typedef int     CLIENT_EVENT_T(CLIENT_DATA_T *cd);
typedef void    TIMER_EVENT_T (CLIENT_DATA_T *cd, int event);

/// 定时器
typedef struct _timer_t
{
    int                 index;                  // 定时器索引
    time_t              expire;                 // 超时时间
    CLIENT_DATA_T      *clientData;             // 用户数据
} TIMER_T;

/// SOCKET BUFFER
typedef struct _sock_buffer_t
{
    u_char              buffer[1024];           // 接收缓存区
    u_int               bufferLength;           // 带接收数据长度
    u_int               bufferPosition;         // 混冲区数据位置
    void               *data;                   // 通用数据指针
} SOCK_BUFFER_T;

/// 用于收发送文件
typedef struct _file_info_t
{
    int                 filefd;                 // 文件fd
    int                 position;               // 文件的当前位置
    int                 length;                 // 文件的长度
    u_char             *buffer;                 // 文件的缓存区
} FILE_INFO_T;

/// certificate
#define CERTIFICATE_BUFFERLEN       2032
typedef struct _certificate_t CERTIFICATE_T;
struct _certificate_t
{
    u_char              buffer[CERTIFICATE_BUFFERLEN];// 证书缓存区
    u_int               bufferLength;           // 证书长度
    u_int               bufferPosition;         // 证书位置
    CERTIFICATE_T      *next;                   // 下一个证书结构
};

/// 用户数据
struct _client_data_t
{
    int                 sockfd;                 // sock描述符
    u_int               ipAddress;              // 客户端IP地址
    u_int               vpnPortIndex:8;         // vpn端口号
    char               *commonName;             // 用户的CN
    u_int               shutdown:1;             // 是否要关闭客户端
    u_int               certpool:1;             // 是否使用证书池
    u_int               iptableFlag:1;          // iptable标志
    u_int               commomFlag:1;           // 标志
    u_int               nLostHeartBeat:2;       // 丢包次数
    SOCK_BUFFER_T      *sockBuffer;             // sockbuf
    FILE_INFO_T         fileInfo;               // 存储大数据
    CLIENT_EVENT_T     *callback;               // 回调函数
    TIMER_T             timer;                  // 定时器
    CLIENT_DATA_T      *next;                   // 指向下一个元素
};

/***************************其它数据结构*********************/

/// 绑定信息
typedef struct _login_bind_t
{
    char               *serialNumber;           // 序列号
    char               *commomName;             // 名称
    char               *province;               // 省
    char               *city;                   // 市
    char               *organization;           // 组织
    char               *institution;            // 机构
    char               *email;                  // 电子邮件
    char               *hardwarePlatform;       // 硬件平台
    char               *hardwareSN;             // 硬件号
    char               *OSVersion;              // OS版本
    char               *phoneNumber;            // 手机号码
    char               *clientVersion;          // 客户端版本号
    ///****************patched by xiaohu mod*************2016/03/17*******
    char               *androidType;            //添加android类型显示
} LOGIN_BIND_T;

/// 规则信息
typedef struct _rule_config_t
{
    u_int               serialNumber:1;          // 序列号
    u_int               commomName:1;            // 名称
    u_int               hardwarePlatform:1;      // 硬件平台
    u_int               hardwareSN:1;            // 硬件号
    u_int               OSVersion:1;             // 操作系统版本
    u_int               phoneNumber:1;           // 手机号码
    u_int               clientVersion:1;         // 客户端版本
    u_int               nLogin:4;                // 测试次数
    u_int               verify:1;                // 是否认证
} RULE_CONFIG_T;

/// openvpn的配置文件
typedef struct _openvpn_info_t
{
    char               *proto;
    char               *cipher;
    char               *auth;
    char               *tun_mtu;
    char               *fragment;
    char               *mssfix;
    char               *tls_auth;
} OPENVPN_INFO_T;

/// stunnel配置信息
typedef struct _stunnel_info_t
{
    char              *ciphers;
    char              *compression;
} STUNNEL_INFO_T;

///****************patched by xiaohu mod *****2016/0３/1６*******
///checkrunningswitch.conf配置信息
typedef struct _check_run_info_win_t
{
    char              *checkSleepTime;
    char              *twoWay;      //internet?
} CHECK_RUN_INFO_WIN_T;             //windows客户端运行时检查配置

///adcheckswitch.conf配置信息
typedef struct _check_pre_info_and_t
{
    char              *root;        //root?
    char              *wifi;        //wifi?
} CHECK_PRE_INFO_AND_T;             //android手机事前检查

///adcheckrunningswitch.conf配置信息
typedef struct _check_run_info_and_t
{
    char              *checkSleepTime;
    char              *twoWay;
    char              *share;
    char              *bluetooth;
} CHECK_RUN_INFO_AND_T;          //android手机运行中检查

///********************************************************

/********************** 其相关定义 ************************/
/// 宏定义
#define NO                      0
#define YES                     1
#define SHARED_TEMP_BUFLEN      128
#define SERVER_TEMP_BUFLEN      256
#define SQL_BUFLEN              CLIENT_SOCK_RECV_MAXBUF


#endif

/******************* (C) COPYRIGHT 2016 上海今中网络科技有限公司 *****END OF FILE****/



